package modules.queue;

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.TimeUnit;

/**
 * 阻塞队列 blockingQueue
 *      4组API
 *      添加	add	   offer	put	    offer(timenum，timeUnit)
 *      移除	remove	poll	take	poll(timenum，timeUnit)
 *      判断队列首  element	peek
 * @author shengren.yan
 * @create 2021-03-11
 */
@SpringBootTest
public class BlockingQueue1 {

    // 抛出异常
    @Test
    void Test1(){
        //需要初始化队列的大小
        ArrayBlockingQueue  deque = new ArrayBlockingQueue<>(3);
        //添加
        deque.add("a");
        deque.add("c");
        deque.add("b");
        // 抛出异常：java.lang.IllegalStateException: Queue full
        // deque.add("e");
        System.out.println(deque);
        //移除
        deque.remove();
//        deque.remove();
//        deque.remove();
        System.out.println(deque);
        //判断队列首
        Object element = deque.element();
        System.out.println(element);
    }

    // 不抛出异常
    @Test
    void Test2(){
        //需要初始化队列的大小
        ArrayBlockingQueue  deque = new ArrayBlockingQueue<>(3);
        //添加
        deque.offer("a");
        deque.offer("c");
        deque.offer("b"); //true
        //添加 一个不能添加的元素 使用offer只会返回 false 不会抛出异常
        System.out.println( deque.offer("e"));
        //移除
        deque.poll();
//        deque.poll();
//        deque.poll();
        //移除 如果没有元素 只会返回null 不会抛出异常
        System.out.println(deque);
        //判断队列首
        Object element = deque.peek();
        System.out.println(element);
    }

    // 等待 一直阻塞
    @Test
    void Test3() throws InterruptedException {
        //需要初始化队列的大小
        ArrayBlockingQueue  deque = new ArrayBlockingQueue<>(3);
        //添加  一直阻塞 不会返回
        deque.put("a");
        deque.put("c");
        deque.put("b");
        //如果队列已经满了， 再进去一个元素  这种情况会一直等待这个队列 什么时候有了位置再进去，程序不会停止
        //deque.put("e");
        //移除
        deque.take();
//        deque.take();
//        deque.take();
        //如果我们再来一个  这种情况也会等待，程序会一直运行 阻塞
        System.out.println(deque);
    }


    // 等待 超时阻塞
    @Test
    void Test4() throws InterruptedException {
        //需要初始化队列的大小
        ArrayBlockingQueue  deque = new ArrayBlockingQueue<>(3);
        //添加  这种情况也会等待队列有位置 或者有产品 但是会超时结束
        deque.offer("a",2, TimeUnit.SECONDS);
        deque.offer("b",2, TimeUnit.SECONDS);
        deque.offer("c",2, TimeUnit.SECONDS);
        //超时时间2s 等待如果超过2s就结束等待
        deque.offer("e",2, TimeUnit.SECONDS);

        //移除
        deque.poll(2, TimeUnit.SECONDS);
        deque.poll(2, TimeUnit.SECONDS);
        deque.poll(2, TimeUnit.SECONDS);
        deque.poll(2, TimeUnit.SECONDS);
        //超过两秒 我们就不要等待了
        System.out.println(deque);
    }

}
